#ifndef MEDIAPLAYLIST_H
#define MEDIAPLAYLIST_H

#include <QObject>
#include <QList>
#include <QUrl>
#include <QMediaPlayer>

class MediaPlaylist : public QObject
{
    Q_OBJECT
public:
    MediaPlaylist();
    enum PlaybackMode {
        CurrentItemOnce,
        CurrentItemInLoop,
        Sequential,
        Loop,
        Random
    };
    Q_ENUM(PlaybackMode)

    void bindToPlayer(QMediaPlayer *player);
    void unbindPlayer();
    bool isBoundToPlayer() const;

    explicit MediaPlaylist(QObject *parent = nullptr);

    int currentIndex() const;    // 获取当前播放的媒体索引。
    QUrl currentMedia() const;   // 获取当前播放的媒体URL

    int nextIndex(int steps = 1) const;      // 计算下一个媒体的索引，可以指定步长
    int previousIndex(int steps = 1) const;  // 计算上一个媒体的索引，可以指定步长。

    void addMedia(const QUrl &content);      // 添加单个媒体到播放列表
    void addMedia(const QList<QUrl> &items); // 添加多个媒体到播放列表
    void insertMedia(int index, const QUrl &content);      // 在指定位置插入单个媒体
    void insertMedia(int index, const QList<QUrl> &items); // 在指定位置插入多个媒体
    bool removeMedia(int pos);             // 移除指定位置的媒体
    bool removeMedia(int start, int end);  // 移除指定范围的媒体
    void clear();  // 清空播放列表

    bool isEmpty() const;        // 检查播放列表是否为空
    int mediaCount() const;      // 获取播放列表中的媒体数量
    QUrl media(int index) const; // 获取指定索引的媒体URL

    PlaybackMode playbackMode() const;       // 获取当前的播放模式
    void setPlaybackMode(PlaybackMode mode); // 设置播放模式

    void shuffle();  // 打乱播放列表顺序

    void setCurrentIndex(int index);   // 设置当前播放的媒体索引
    void next();      // 播放下一个媒体
    void previous();  // 播放上一个媒体

    void connectToPlayer(QMediaPlayer *player);   // 连接到一个QMediaPlayer实例

signals:
    void currentIndexChanged(int index);
    void currentMediaChanged(const QUrl &content);
    void playbackModeChanged(PlaybackMode mode);
    void mediaAboutToBeInserted(int start, int end);
    void mediaInserted(int start, int end);
    void mediaAboutToBeRemoved(int start, int end);
    void mediaRemoved(int start, int end);
    void mediaChanged(int start, int end);
private slots:
    void handlePlayerStateChanged(QMediaPlayer::PlaybackState state);
    void handleMediaFinished();

private:
    QList<QUrl> m_mediaList;
    int m_currentIndex = -1;
    PlaybackMode m_playbackMode = Sequential;
    QMediaPlayer *m_player = nullptr;

    int randomIndex() const;
    void updatePlayerSource();
    QMediaPlayer *m_boundPlayer = nullptr;
    bool m_autoPlayOnBind = true;
    bool m_autoPlayNext = false;
};

#endif // MEDIAPLAYLIST_H
